package fiuba.algo3.algoThieft.vista;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Choice;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;








import fiuba.algo3.algoThieft.controlador.Controlador;
import fiuba.algo3.algoThieft.modelo.Capital;
import fiuba.algo3.algoThieft.modelo.ErrorNoSeInicioUnNuevoCaso;
import fiuba.algo3.algoThieft.modelo.Juego;
import fiuba.algo3.algoThieft.modelo.Lugar;
import fiuba.algo3.algoThieft.modelo.ObjetoRobado;
import fiuba.algo3.algoThieft.modelo.PersonajePolicial;


public class VentanaCaso extends Ventana  {
	private Button botonVisitar = new Button("Visitar");
	private Button botonViajar = new Button("Viajar");
	private Button botonOrden = new Button("Generar orden de arresto");
	private Choice choiceLugar = new Choice();
	private Juego modelo;
	private Controlador control;
	private Choice choiceCapital = new Choice();	
	private Label labelCabecera = new Label();
	
	private Panel panelDescripcion = new Panel();
	private Panel panelLugar = new Panel();;
	private Panel panelCapital = new Panel();
	private Panel panelDatos = new Panel();
	private Panel panelOrden = new Panel();
	
	public VentanaCaso(Juego modelo, Controlador control) {
		this.control = control;
		this.modelo = modelo;
		
		this.frame = new Frame("AlgoThieft" ); //creando el marco
		this.frame.setLayout(new BorderLayout());
			
		this.panelDescripcion.setLayout(new FlowLayout());
		
		
		new CentralizadorDeVentana().centrarVentana(this.frame);

		//agrego el listener del evento de cerrado de la ventana		
		this.frame.addWindowListener(new CloseListener());
						
		//agrego los listeners a los choice
		this.choiceLugar.addItemListener(control.getListenerChoiceLugar());
		this.choiceCapital.addItemListener(control.getListenerChoiceCapital());
		
		//agrego los listeners a los botones
		this.botonVisitar.addActionListener(control.getListenerBotonEscuchaBotonVisitar());
		this.botonViajar.addActionListener(control.getListenerBotonEscuchaBotonViajar());
		this.botonOrden.addActionListener(this.getListenerBotonOrden());
			
		}
	private class EscuchaBotonOrden implements ActionListener
	{	public void actionPerformed(ActionEvent e) 
		{
			if (modelo.ordenDeArrestoEmitida()){
				new DialogMensaje(frame,"YA EMITISTE UNA ORDEN DE ARRETO!!!",
						"Ya has emitido una orden de arresto para este caso" 
						,"no puedes emitir otra orden hasta finalizar el caso actual");
			}else{
				frame.setVisible(false);
				VentanaOrden ventanaOrden = new VentanaOrden( control );
				ventanaOrden.mostrar();
			}
				
				
		}

	}
		
		private ActionListener getListenerBotonOrden() {
		
		return new EscuchaBotonOrden();
	}


		private void mostrarIntroduccionAlCaso() throws ErrorNoSeInicioUnNuevoCaso {
			ObjetoRobado objetoRobado = modelo.obtenerObjetoRobado();
			String casoLinea1 = "Han robado " + objetoRobado.getNombre() + " en la ciudad de "+ objetoRobado.getUbicacionInicial().getNombre();
			String casoLinea2 = "El sospechoso es de sexo " + modelo.getSexoDelLadron();
			new DialogMensaje(this.frame, "Nuevo caso" , casoLinea1 , casoLinea2 );
		
	}


		private void llenarChoices() {
		
			this.choiceLugar.removeAll();			
			this.choiceLugar.add("Elija una opcion");
			PersonajePolicial personaje = this.modelo.getPersonajeActual();
			List<Lugar> lugares = personaje.getUbicacion().getLugares();
			for ( Lugar lugar : lugares ){
				this.choiceLugar.add(lugar.getNombre());
			}
			
			
			this.choiceCapital.removeAll();
			this.choiceCapital.add("Elija un opcion");
			List<Capital> capitales = personaje.getUbicacion().getCapitalesAdyacentes();
			Collections.shuffle(capitales);
			for ( Capital capital : capitales ){
				this.choiceCapital.add(capital.getNombre());
			}
	
	}


		public static class CloseListener extends WindowAdapter	
		{	public void windowClosing(WindowEvent e)
		{	e.getWindow().setVisible(false);
		System.exit(0);
		}
		}

		public void actualizarInformacion() {
			this.actualizarComponentes();
			this.acomodarComponentes();
		}
		private void actualizarComponentes(){
			
			Capital capital = this.modelo.getPersonajeActual().getUbicacion();
			this.labelCabecera.setText(this.modelo.getTiempoComoString() + " - " + capital.getNombre() + ", " + capital.getPais() );
			
			panelDescripcion.removeAll();
			List<String> pedezosDeLaDescripcion = this.cortarDescripcion();
			for ( String cadena : pedezosDeLaDescripcion ){
				this.panelDescripcion.add( new Label(cadena));
			}			
			this.llenarChoices();
			
		}
		
		public void iniciar() throws ErrorNoSeInicioUnNuevoCaso{
			
			this.actualizarInformacion();
			this.mostrarIntroduccionAlCaso();
		}
		
		private void acomodarComponentes(){
			// quito los componentes anteriores
			frame.removeAll();
			panelLugar.removeAll();
			panelCapital.removeAll();
			panelOrden.removeAll();
			panelDatos.removeAll();
			
			// agregando componentes	
			this.frame.add( panelDescripcion , BorderLayout.CENTER );
			
						
			
			this.frame.add(labelCabecera , BorderLayout.NORTH );
			
			Panel panelComandos = new Panel();
			panelComandos.setLayout( new GridLayout(0,1));
			
			panelComandos.add(new Label("Que quieres hacer?" ) );
			
			panelLugar.add(this.choiceLugar,"West" );
			panelLugar.add(this.botonVisitar,"East");		
			panelComandos.add(panelLugar ); 
			
			
			panelCapital.add(this.choiceCapital,"West" );
			panelCapital.add(this.botonViajar,"East");		
			panelComandos.add( panelCapital ); 
			
			
			panelOrden.add("Center" , this.botonOrden);
			panelComandos.add( panelOrden );
			
			this.frame.add( panelComandos, BorderLayout.SOUTH );
			
			//cambio el tamanio del frame para que los
			//layouts reacomoden sus componentes
			
			this.frame.setSize(301,450);
			this.frame.setSize(300,450);  
			
			new CentralizadorDeVentana().centrarVentana(this.frame);
			 
		}
		
		private List<String> cortarDescripcion(){
			List<String> cadenas = new ArrayList<String>();
			String descripcion = this.modelo.getPersonajeActual().getUbicacion().getDescripcion();
			while (descripcion.length() > 0 ){
				if (descripcion.length() > 45 ){
					cadenas.add(descripcion.substring(0 , 45));
					descripcion = descripcion.substring( 45, descripcion.length() );					
				}else{
					cadenas.add(descripcion.substring(0 , descripcion.length()));
					descripcion = "";
				}
			}
			
			return cadenas;
		}
}
